/*****************************************************************************
 * $LastChangedDate: 2011-04-23 21:07:07 -0400 (Sat, 23 Apr 2011) $
 * @file
 * @author  Jim E. Brooks
 * @brief   Less-frequently used functions.
 *//*
 * LEGAL:   COPYRIGHT (C) 2004 JIM E. BROOKS
 *          THIS SOURCE CODE IS RELEASED UNDER THE TERMS
 *          OF THE GNU GENERAL PUBLIC LICENSE VERSION 2 (GPL 2).
 *****************************************************************************/

#ifndef DOXYGEN  // doxygen can't parse this correctly
#ifndef BASE_FUNCS2_HH
#define BASE_FUNCS2_HH 1

namespace base {

////////////////////////////////////////////////////////////////////////////////
//////////////////////////  function macros  ///////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
////////////////////////////  inline functions  ////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

/*******************************************************************************
 * If power of 2.
 *******************************************************************************/
INLINE bool IfPowerOf2( int n )
{
    // Trick: result is 0 if n is a power of 2.
  //return (n & (n-1)) == 0;  // bug: 0 isn't a power-of-2
    return (n != 0) and ((n & (n-1)) == 0);
}

/*******************************************************************************
 * If even or odd.
 *******************************************************************************/
INLINE bool IfEven( int n ) { return (n & 1) == 0; }
INLINE bool IfOdd( int n )  { return (n & 1) == 1; }

/*******************************************************************************
 * +1 or -1 if true or false.
 *******************************************************************************/
INLINE int PlusOrMinus1( bool plus )
{
    return plus ? 1 : -1;
}

////////////////////////////////////////////////////////////////////////////////
/////////////////////////  template functions  /////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

/*****************************************************************************
 * @return True if two numbers are both positive or both negative.
 *****************************************************************************/
template<typename T> bool IfSameSign( T a, T b )
{
    return ((a  < 0) and (b  < 0))
        or ((a >= 0) and (b >= 0));  // 0 is positive
}

} // namespace base

#endif // BASE_FUNCS2_HH
#endif // DOXYGEN
